package com.syedu.day15;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * description：Java创建线程的方式之一
 * 写一个类实现java.util.current.Callable接口并且重写call()方法
 *
 * 此方式和前两种方式的最大区别在于前两种方法的线程方法返回类型是void的,所以多线程方法运行完毕后
 * 无法得到返回值,此方式就解决了这个问题,call()可以有返回值
 *
 * @author Administrator
 * @date 2022/3/31 15:07
 */
public class ThreadDemo3 implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for (; i < 10; i++) {
            System.out.println(i);
        }
        return i;
    }
}

class TestThreadDemo3 {
    public static void main(String[] args) {
        Callable<Integer> c = new ThreadDemo3();
        //实例化FutureTask对象,它包装了Callable类并且间接继承了Runnable
        FutureTask<Integer> futureTask = new FutureTask<>(c);
        //启动线程
        Thread t = new Thread(futureTask);
        t.start();

        //获取线程方法执行后得到的返回值
        try {
            System.out.println("线程返回值: " + futureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}